﻿using System;
using 委托和事件.委托.Action;

namespace 委托和事件
{
    class Program
    {
        public delegate string CheckMsgCode();
        public delegate TResult Func<in T, out TResult>(T arg);
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            BLL b = new BLL();
            //2声明委托
            CheckMsgCode che = new CheckMsgCode(b.DeleteMember);
            var deg = che();

            CheckMsgCode goods = new CheckMsgCode(b.GoodsExcelOut);
            var goods1 = CheckMsgCodeAction(goods);
            //告诉CheckMsgCode执行GoodsExcelOut方法

            CheckMsgCode chain = new CheckMsgCode(b.ChainStoreExcelOut);
            var chain1 = CheckMsgCodeAction(chain);

            //2 Func委托必须有返回值
            Func<string, string> FuncF = TS;
            FuncF("FUNC");

            //3 Action委托没有返回值
            Action<string> ac = new Action<string>(ActionM);
            //ac.Invoke("ACTION");
            TestAction.OnRegistred(ac);

            ac.Invoke("+action+===");
            //方法不能作为参数之间传递，所以需要委托
            //委托本身作为一个参数传入方法内,委托本身又携带了方法，所以等于是把方法作为一个参数传入了另一个方法
            //

        }
        public static string CheckMsgCodeAction(CheckMsgCode deleget)
        {
            bool succ = true;
            string msg = string.Empty;

            if (succ == true)//验证成功之后不知道调用接下来干什么，
                             //就不知道执行哪个方法,把委托传进来
            {
                //调用委托
                return deleget();
            }
            else { return "验证码错误"; }

        }
        public static string TS(string s)
        {
            var C = s.ToLower();
            Console.WriteLine($@"**********Func委托有返回值****{C}***********");
            return C;
        }
        public static void ActionM(string s)
        {
            Console.WriteLine($@"*****Action委托{s}********");
            //doSomething
        }

    }
}
